From: Florian Müllner Date: Thu, 7 Jul 2016 16:50:49 +0000 (+0200) Subject: calendar-server: Use the actual recurrence ID of events X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~797 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=7e0e224e0eb8;p=gnome-shell.git calendar-server: Use the actual recurrence ID of events Instead of querying the client for a list of objects and using e_cal_recur_generate_instances() to get occurrences for each of them, we can use e_cal_client_generate_instances_sync() which combines the functionality of both functions. This doesn't only save us some lines of code (yay!), but also gives us access to the real recurrence ID of an event, so we can get rid of the hack of faking one. https://bugzilla.gnome.org/show_bug.cgi?id=748226 --- diff --git a/src/calendar-server/gnome-shell-calendar-server.c b/src/calendar-server/gnome-shell-calendar-server.c index 83da77937..5ff12f23e 100644 --- a/src/calendar-server/gnome-shell-calendar-server.c +++ b/src/calendar-server/gnome-shell-calendar-server.c @@ -95,6 +95,12 @@ typedef struct GSList *occurrences; } CalendarAppointment; +typedef struct +{ + ECalClient *client; + GHashTable *appointments; +} CollectAppointmentsData; + static time_t get_time_from_property (icalcomponent *ical, icalproperty_kind prop_kind, @@ -396,78 +402,49 @@ resolve_timezone_id (const char *tzid, return retval; } -static gboolean -calendar_appointment_collect_occurrence (ECalComponent *component, - time_t occurrence_start, - time_t occurrence_end, - gpointer data) +static CalendarAppointment * +calendar_appointment_new (icalcomponent *ical, + ECalClient *cal) { - CalendarOccurrence *occurrence; - GSList **collect_loc = data; - char *rid; - - /* HACK: component is the primary event, so we don't have access - * to the actual recur ID; fake one if the event has any - * recurrences - */ - if (e_cal_component_has_recurrences (component)) - rid = ctime (&occurrence_start); - else - rid = ""; - - occurrence = g_new0 (CalendarOccurrence, 1); - occurrence->start_time = occurrence_start; - occurrence->end_time = occurrence_end; - occurrence->rid = g_strdup (rid); + CalendarAppointment *appointment; - *collect_loc = g_slist_prepend (*collect_loc, occurrence); + appointment = g_new0 (CalendarAppointment, 1); - return TRUE; + calendar_appointment_init (appointment, ical, cal); + return appointment; } -static void -calendar_appointment_generate_occurrences (CalendarAppointment *appointment, - icalcomponent *ical, - ECalClient *cal, - time_t start, - time_t end) +static gboolean +generate_instances_cb (ECalComponent *comp, + time_t start, + time_t end, + gpointer data) { - ECalComponent *ecal; - icaltimezone *default_zone; - - g_assert (appointment->occurrences == NULL); + ECalClient *cal = ((CollectAppointmentsData *)data)->client; + GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments; + CalendarAppointment *appointment; + CalendarOccurrence *occurrence; + const char *uid; - default_zone = e_cal_client_get_default_timezone (cal); + e_cal_component_get_uid (comp, &uid); + appointment = g_hash_table_lookup (appointments, uid); - ecal = e_cal_component_new (); - e_cal_component_set_icalcomponent (ecal, - icalcomponent_new_clone (ical)); + if (appointment == NULL) + { + icalcomponent *ical = e_cal_component_get_icalcomponent (comp); - e_cal_recur_generate_instances (ecal, - start, - end, - calendar_appointment_collect_occurrence, - &appointment->occurrences, - (ECalRecurResolveTimezoneFn) resolve_timezone_id, - cal, - default_zone); + appointment = calendar_appointment_new (ical, cal); + g_hash_table_insert (appointments, g_strdup (uid), appointment); + } - g_object_unref (ecal); + occurrence = g_new0 (CalendarOccurrence, 1); + occurrence->start_time = start; + occurrence->end_time = end; + occurrence->rid = e_cal_component_get_recurid_as_string (comp); - appointment->occurrences = g_slist_reverse (appointment->occurrences); + appointment->occurrences = g_slist_append (appointment->occurrences, occurrence); } -static CalendarAppointment * -calendar_appointment_new (icalcomponent *ical, - ECalClient *cal) -{ - CalendarAppointment *appointment; - - appointment = g_new0 (CalendarAppointment, 1); - - calendar_appointment_init (appointment, ical, cal); - return appointment; -} /* ---------------------------------------------------------------------------------------------------- */ @@ -647,6 +624,7 @@ app_load_events (App *app) GError *error; GSList *objects, *j; ECalClientView *view; + CollectAppointmentsData data; e_cal_client_set_default_timezone (cal, app->zone); @@ -660,37 +638,13 @@ app_load_events (App *app) continue; } - error = NULL; - objects = NULL; - if (!e_cal_client_get_object_list_sync (cal, - query, - &objects, - NULL, /* cancellable */ - &error)) - { - ESource *source = e_client_get_source (E_CLIENT (cal)); - g_warning ("Error querying calendar %s: %s\n", - e_source_get_uid (source), error->message); - g_error_free (error); - g_free (query); - continue; - } - - for (j = objects; j != NULL; j = j->next) - { - icalcomponent *ical = j->data; - CalendarAppointment *appointment; - - appointment = calendar_appointment_new (ical, cal); - calendar_appointment_generate_occurrences (appointment, - ical, - cal, - app->since, - app->until); - g_hash_table_insert (app->appointments, g_strdup (appointment->uid), appointment); - } - - e_cal_client_free_icalcomp_slist (objects); + data.client = cal; + data.appointments = app->appointments; + e_cal_client_generate_instances_sync (cal, + app->since, + app->until, + generate_instances_cb, + &data); error = NULL; if (!e_cal_client_get_view_sync (cal, @@ -922,7 +876,7 @@ handle_method_call (GDBusConnection *connection, char *id = g_strdup_printf ("%s\n%s\n%s", a->source_id, a->uid, - o->rid); + o->rid ? o->rid : ""); g_variant_builder_init (&extras_builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_add (&builder,